//******************************************************************
//******************************************************************
//**********          ANts Peer To Peer Sources        *************
//
// ANts P2P realizes a third generation P2P net. It protects your
// privacy while you are connected and makes you not trackable, hiding
// your identity (ip) and crypting everything you are sending/receiving
// from others.

// Copyright (C) 2004  Roberto Rossi

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


package ants.p2p.utils.encoding;

public class Base16 {

  public static String toHexString(byte[] b) {
    StringBuffer sb = new StringBuffer(b.length * 2);
    for (int i = 0; i < b.length; i++) {
      // look up high nibble char
      sb.append(hexChar[ (b[i] & 0xf0) >>> 4]);

      // look up low nibble char
      sb.append(hexChar[b[i] & 0x0f]);
    }
    return sb.toString();
  }

  public static byte[] fromHexString ( String s )
   {
   int stringLength = s.length();
   if ( (stringLength & 0x1) != 0 ){
      throw new IllegalArgumentException ( "fromHexString requires an even number of hex characters" );
   }
   byte[] b = new byte[stringLength / 2];

   for ( int i=0,j=0; i<stringLength; i+=2,j++ )
      {
      int high = charToNibble( s.charAt ( i ) );
      int low = charToNibble( s.charAt ( i+1 ) );
      b[j] = (byte)( ( high << 4 ) | low );
      }
   return b;
   }

/**
* convert a single char to corresponding nibble.
*
* @param c char to convert. must be 0-9 a-f A-F, no
* spaces, plus or minus signs.
*
* @return corresponding integer
*/
private static int charToNibble ( char c )
   {
   if ( '0' <= c && c <= '9' )
      {
      return c - '0';
      }
   else if ( 'a' <= c && c <= 'f' )
      {
      return c - 'a' + 0xa;
      }
   else if ( 'A' <= c && c <= 'F' )
      {
      return c - 'A' + 0xa;
      }
   else
      {
      throw new IllegalArgumentException ( "Invalid hex character: " + c );
      }
   }


  // table to convert a nibble to a hex char.
  static char[] hexChar = {
      '0', '1', '2', '3',
      '4', '5', '6', '7',
      '8', '9', 'a', 'b',
      'c', 'd', 'e', 'f'};
}
